(function(){

  let g={},h=false;


  function choice(b){
    h=b; //h=btoa(b);
    if(h in g === false){
      if(typeof b==='string'){
        g[h]=dGet(document,b);g[h]['limit']=[];
        for(let l=0;l<g[h].length;l++){
          g[h]['limit'][l]=l;
        }
      }
    }
    return false;
  }


  function andChoice(gA,dA){
    let gB={},gC=[],gD=[];
    if(typeof dA==='object'){
      for(let l=0;l<dA.length;l++){
        for(let al=0;al<gA.length;al++){
          gB=dGet(gA[al],dA[l]);
          for(let bl=0;bl<gB.length;bl++){
           gC[bl]=gB[bl];gD[bl]=bl;
          }
        }
        g[h]=gC;gA=gC;gC=[];g[h]['limit']=gD;gD=[];
      }
    }
    gB=false;gC=false;gD=false;return false;
  }


  function orderChoice(gA,dA){
    let gB={},gC=[],gD=[];
    if(typeof dA==='object' && dA!==null){
      for(let k in dA){
        let lA=0,lB=0,kR=dA[k];
        for(let al=0;al<gA.length;al++){
          gB=dGet(gA[al],k);
          for(let kl=0;kl<kR.length;kl++){
            gC[lA++]=gB[kR[kl]-1];lB=gC.length-1;gD[lB]=lB;
          }
        }
        g[h]=gC;gA=gC;gC=[];g[h]['limit']=gD;gD=[];lA=0;lB=0;
      }
    }
    gB=false;gC=false;gD=false;return false;
  }


  function dGet(d,b){
    let dA=[],dB=false;
    switch(b.charAt(0)){
      case'#':dB=d.getElementById(b.substring(1));if(dB===null){dA=[false];}else{dA=[dB];}break;
      case'.':dA=d.getElementsByClassName(b.substring(1));break;
      case':':dA=d.getElementsByName(b.substring(1));break;
      default:dA=d.getElementsByTagName(b);;
    }
    dB=false;return dA;
  }

  a=function(b){
    choice(b);
    return c={

      'd':function(f){
        let r=false;
        for(let l=0;l<g[h]['limit'].length;l++){
          r=f(g[h][g[h]['limit'][l]]);
        }
        return r;
      },
 
      'and':function(bA){
        h=btoa(bA);
        if(h in g === false){andChoice(g[b],bA);}
        return c;
      },

      'order':function(bA){
        h=btoa(bA);
        orderChoice(g[b],bA);
        return c;
      },

      'limit':function(v){
        g[h]['limit']=[];
        for(let l=0;l<v.length;l++){
          g[h]['limit'][l]=v[l]-1;
        }
        return c;
      },

      'html':function(v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.innerHTML;});
        }else{
          c.d(function(i){i.innerHTML=v;return true;});return c;
        }
      },

      'text':function(v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.value;});
        }else{
          c.d(function(i){i.value=v;return true;});return c;
        }
      },

      'attr':function(u,v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.getAttribute(u);});
        }else{
          c.d(function(i){i.removeAttribute(u);i.setAttribute(u,v);return true;});return c;
        }
      },

      'css':function(u,v){
        if(u==='style'){
          c.d(function(i){i.style.cssText=v;});
        }else{
          c.d(function(i){i.style[u]=v;});
        }
        return c;
      },
  
      'class':function(v){
        return c.d(function(i){i.className=v;return true;});
      },
   
      'count':function(){
        return g[h].length;
      },

      'dom':function(v){
        if(typeof v==='undefined'){return g[h];}else{return g[h][v-1];}
      },

      'fo':function(f){
          c.d(function(i){f(i);});
      },

      'fu':function(f){
          f(g[h]);
      },
  
      'on':function(u,f){
        c.d(function(i){
          if(i.addEventListener){
            // 所有主流浏览器，除了 IE 8 及更早 IE版本
            i.addEventListener(u,function(event){
              f(i,g[h]);event.stopPropagation(); //阻止事件冒泡
            },false);
          }else{
            // IE 8 及更早 IE 版本
            i.attachEvent("on"+u,function(event){f(i,g[h]);event.stopPropagation();},false);
          }
        });
      },
  
      'tagIn':function(v,f){
        // 等待解决的问题，如果频繁的添加和删除会报错 ，百度appendChild 频繁操作会报错会有解决方案
        let t=document.createElement(v['tag']); // 创建新标签
        if(typeof f!='undefined'){f(t);}
        if(v['sort']){
          let tA=dGet(g[h][v['limit']-1],v['tag']);
          if(v['sort'] > tA.length){
            g[h][v['limit']-1].appendChild(t); // 输入的值大于标签数就从后面添加
          }else{
            g[h][v['limit']-1].insertBefore(t,tA[v['sort']-1]); // 指定位置添加
          } 
        }else{
          g[h][v['limit']-1].appendChild(t); // 把标签写入指定父元素，而且从后面添加
        }
        t=false;tA=false;return true;
      },

      'tagDe':function(v){
        let tA=dGet(g[h][v['limit']-1],v['tag']);
        for (let l=0;l<v['sort'].length;l++){
          g[h][v['limit']-1].removeChild(tA[v['sort'][l]-1]);
        }
        tA=false;return true;
      },
 
      'tagSo':function(v){
        let tA=dGet(g[h][v['limit']-1],v['tag']);
        g[h][v['limit']-1].insertBefore(tA[v['sort'][0]-1],tA[v['sort'][1]-1]); // 元素移动，第一个值是要移动的元素，第二个值是把移动的元素移动到它前面的意思
        tA=false;return true;
      },

      'size':function(v){
        return c.d(function(i){
          switch(v){
            case'width':return i.offsetWidth;break; // 包含边框 border，内边距 padding ，不含外边距 margin
            case'height':return i.offsetHeight;break;
            case'left':return i.offsetLeft;break;
            case'top':return i.offsetTop;break;
          }
        });
      },
      'version':'1.0'
    };
  }

})();

/*
大写字母：A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z。
小写字母：a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z。


a 外部主函数
b 外部主函数传入参数
c 内部主对象
d DOM 循环
e 
f 指定内部函数


g 存放DOM对象获取
h 对象键名
i 对象单数

l for 循环指定变量

r 主对象的返回变量
v 内部主对象的传入参数

*/